{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# XGBoost Parameter Tuning for RentListingInquries"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 1. 用xgboost内嵌的cv寻找最佳的参数n_estimators"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "#导入准备调用的模块\n",
    "from xgboost import XGBClassifier\n",
    "import xgboost as xgb\n",
    "\n",
    "import pandas as pd \n",
    "import numpy as np\n",
    "\n",
    "from sklearn.model_selection import GridSearchCV\n",
    "from sklearn.model_selection import StratifiedKFold\n",
    "\n",
    "from sklearn.metrics import log_loss\n",
    "\n",
    "from matplotlib import pyplot\n",
    "import seaborn as sns\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style>\n",
       "    .dataframe thead tr:only-child th {\n",
       "        text-align: right;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: left;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>bathrooms</th>\n",
       "      <th>bedrooms</th>\n",
       "      <th>price</th>\n",
       "      <th>price_bathrooms</th>\n",
       "      <th>price_bedrooms</th>\n",
       "      <th>room_diff</th>\n",
       "      <th>room_num</th>\n",
       "      <th>Year</th>\n",
       "      <th>Month</th>\n",
       "      <th>Day</th>\n",
       "      <th>...</th>\n",
       "      <th>walk</th>\n",
       "      <th>walls</th>\n",
       "      <th>war</th>\n",
       "      <th>washer</th>\n",
       "      <th>water</th>\n",
       "      <th>wheelchair</th>\n",
       "      <th>wifi</th>\n",
       "      <th>windows</th>\n",
       "      <th>work</th>\n",
       "      <th>interest_level</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1.5</td>\n",
       "      <td>3</td>\n",
       "      <td>3000</td>\n",
       "      <td>1200.0</td>\n",
       "      <td>750.000000</td>\n",
       "      <td>-1.5</td>\n",
       "      <td>4.5</td>\n",
       "      <td>2016</td>\n",
       "      <td>6</td>\n",
       "      <td>24</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1.0</td>\n",
       "      <td>2</td>\n",
       "      <td>5465</td>\n",
       "      <td>2732.5</td>\n",
       "      <td>1821.666667</td>\n",
       "      <td>-1.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>2016</td>\n",
       "      <td>6</td>\n",
       "      <td>12</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>1.0</td>\n",
       "      <td>1</td>\n",
       "      <td>2850</td>\n",
       "      <td>1425.0</td>\n",
       "      <td>1425.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>2.0</td>\n",
       "      <td>2016</td>\n",
       "      <td>4</td>\n",
       "      <td>17</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>1.0</td>\n",
       "      <td>1</td>\n",
       "      <td>3275</td>\n",
       "      <td>1637.5</td>\n",
       "      <td>1637.500000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>2.0</td>\n",
       "      <td>2016</td>\n",
       "      <td>4</td>\n",
       "      <td>18</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>1.0</td>\n",
       "      <td>4</td>\n",
       "      <td>3350</td>\n",
       "      <td>1675.0</td>\n",
       "      <td>670.000000</td>\n",
       "      <td>-3.0</td>\n",
       "      <td>5.0</td>\n",
       "      <td>2016</td>\n",
       "      <td>4</td>\n",
       "      <td>28</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>5 rows × 228 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "   bathrooms  bedrooms  price  price_bathrooms  price_bedrooms  room_diff  \\\n",
       "0        1.5         3   3000           1200.0      750.000000       -1.5   \n",
       "1        1.0         2   5465           2732.5     1821.666667       -1.0   \n",
       "2        1.0         1   2850           1425.0     1425.000000        0.0   \n",
       "3        1.0         1   3275           1637.5     1637.500000        0.0   \n",
       "4        1.0         4   3350           1675.0      670.000000       -3.0   \n",
       "\n",
       "   room_num  Year  Month  Day       ...        walk  walls  war  washer  \\\n",
       "0       4.5  2016      6   24       ...           0      0    0       0   \n",
       "1       3.0  2016      6   12       ...           0      0    0       0   \n",
       "2       2.0  2016      4   17       ...           0      0    0       0   \n",
       "3       2.0  2016      4   18       ...           0      0    0       0   \n",
       "4       5.0  2016      4   28       ...           0      0    1       0   \n",
       "\n",
       "   water  wheelchair  wifi  windows  work  interest_level  \n",
       "0      0           0     0        0     0               1  \n",
       "1      0           0     0        0     0               2  \n",
       "2      0           0     0        0     0               0  \n",
       "3      0           0     0        0     0               2  \n",
       "4      0           0     0        0     0               2  \n",
       "\n",
       "[5 rows x 228 columns]"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#读取train的数据文件并显示头5行数据\n",
    "train = pd.read_csv(\"./data/RentListingInquries_FE_train.csv\")\n",
    "train.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "RangeIndex: 49352 entries, 0 to 49351\n",
      "Columns: 228 entries, bathrooms to interest_level\n",
      "dtypes: float64(9), int64(219)\n",
      "memory usage: 85.8 MB\n"
     ]
    }
   ],
   "source": [
    "#读取数据的基本信息\n",
    "train.info()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style>\n",
       "    .dataframe thead tr:only-child th {\n",
       "        text-align: right;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: left;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>bathrooms</th>\n",
       "      <th>bedrooms</th>\n",
       "      <th>price</th>\n",
       "      <th>price_bathrooms</th>\n",
       "      <th>price_bedrooms</th>\n",
       "      <th>room_diff</th>\n",
       "      <th>room_num</th>\n",
       "      <th>Year</th>\n",
       "      <th>Month</th>\n",
       "      <th>Day</th>\n",
       "      <th>...</th>\n",
       "      <th>walk</th>\n",
       "      <th>walls</th>\n",
       "      <th>war</th>\n",
       "      <th>washer</th>\n",
       "      <th>water</th>\n",
       "      <th>wheelchair</th>\n",
       "      <th>wifi</th>\n",
       "      <th>windows</th>\n",
       "      <th>work</th>\n",
       "      <th>interest_level</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>count</th>\n",
       "      <td>49352.00000</td>\n",
       "      <td>49352.000000</td>\n",
       "      <td>4.935200e+04</td>\n",
       "      <td>4.935200e+04</td>\n",
       "      <td>4.935200e+04</td>\n",
       "      <td>49352.000000</td>\n",
       "      <td>49352.000000</td>\n",
       "      <td>49352.0</td>\n",
       "      <td>49352.000000</td>\n",
       "      <td>49352.000000</td>\n",
       "      <td>...</td>\n",
       "      <td>49352.000000</td>\n",
       "      <td>49352.000000</td>\n",
       "      <td>49352.000000</td>\n",
       "      <td>49352.000000</td>\n",
       "      <td>49352.000000</td>\n",
       "      <td>49352.000000</td>\n",
       "      <td>49352.000000</td>\n",
       "      <td>49352.000000</td>\n",
       "      <td>49352.000000</td>\n",
       "      <td>49352.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>mean</th>\n",
       "      <td>1.21218</td>\n",
       "      <td>1.541640</td>\n",
       "      <td>3.830174e+03</td>\n",
       "      <td>1.697863e+03</td>\n",
       "      <td>1.657567e+03</td>\n",
       "      <td>-0.329460</td>\n",
       "      <td>2.753820</td>\n",
       "      <td>2016.0</td>\n",
       "      <td>5.014852</td>\n",
       "      <td>15.206881</td>\n",
       "      <td>...</td>\n",
       "      <td>0.003080</td>\n",
       "      <td>0.000385</td>\n",
       "      <td>0.186477</td>\n",
       "      <td>0.009361</td>\n",
       "      <td>0.000446</td>\n",
       "      <td>0.028165</td>\n",
       "      <td>0.002026</td>\n",
       "      <td>0.001013</td>\n",
       "      <td>0.000952</td>\n",
       "      <td>1.616895</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>std</th>\n",
       "      <td>0.50142</td>\n",
       "      <td>1.115018</td>\n",
       "      <td>2.206687e+04</td>\n",
       "      <td>1.100477e+04</td>\n",
       "      <td>7.817996e+03</td>\n",
       "      <td>0.947732</td>\n",
       "      <td>1.446091</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.824442</td>\n",
       "      <td>8.280749</td>\n",
       "      <td>...</td>\n",
       "      <td>0.055412</td>\n",
       "      <td>0.019618</td>\n",
       "      <td>0.389495</td>\n",
       "      <td>0.101625</td>\n",
       "      <td>0.021109</td>\n",
       "      <td>0.165446</td>\n",
       "      <td>0.044969</td>\n",
       "      <td>0.031814</td>\n",
       "      <td>0.030846</td>\n",
       "      <td>0.626035</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>min</th>\n",
       "      <td>0.00000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>4.300000e+01</td>\n",
       "      <td>2.150000e+01</td>\n",
       "      <td>4.300000e+01</td>\n",
       "      <td>-5.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>2016.0</td>\n",
       "      <td>4.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>...</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>25%</th>\n",
       "      <td>1.00000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>2.500000e+03</td>\n",
       "      <td>1.225000e+03</td>\n",
       "      <td>1.066667e+03</td>\n",
       "      <td>-1.000000</td>\n",
       "      <td>2.000000</td>\n",
       "      <td>2016.0</td>\n",
       "      <td>4.000000</td>\n",
       "      <td>8.000000</td>\n",
       "      <td>...</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>1.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>50%</th>\n",
       "      <td>1.00000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>3.150000e+03</td>\n",
       "      <td>1.500000e+03</td>\n",
       "      <td>1.383417e+03</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>2.000000</td>\n",
       "      <td>2016.0</td>\n",
       "      <td>5.000000</td>\n",
       "      <td>15.000000</td>\n",
       "      <td>...</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>2.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>75%</th>\n",
       "      <td>1.00000</td>\n",
       "      <td>2.000000</td>\n",
       "      <td>4.100000e+03</td>\n",
       "      <td>1.850000e+03</td>\n",
       "      <td>1.962500e+03</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>4.000000</td>\n",
       "      <td>2016.0</td>\n",
       "      <td>6.000000</td>\n",
       "      <td>22.000000</td>\n",
       "      <td>...</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>2.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>max</th>\n",
       "      <td>10.00000</td>\n",
       "      <td>8.000000</td>\n",
       "      <td>4.490000e+06</td>\n",
       "      <td>2.245000e+06</td>\n",
       "      <td>1.496667e+06</td>\n",
       "      <td>8.000000</td>\n",
       "      <td>13.500000</td>\n",
       "      <td>2016.0</td>\n",
       "      <td>6.000000</td>\n",
       "      <td>31.000000</td>\n",
       "      <td>...</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>2.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>2.000000</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>8 rows × 228 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "         bathrooms      bedrooms         price  price_bathrooms  \\\n",
       "count  49352.00000  49352.000000  4.935200e+04     4.935200e+04   \n",
       "mean       1.21218      1.541640  3.830174e+03     1.697863e+03   \n",
       "std        0.50142      1.115018  2.206687e+04     1.100477e+04   \n",
       "min        0.00000      0.000000  4.300000e+01     2.150000e+01   \n",
       "25%        1.00000      1.000000  2.500000e+03     1.225000e+03   \n",
       "50%        1.00000      1.000000  3.150000e+03     1.500000e+03   \n",
       "75%        1.00000      2.000000  4.100000e+03     1.850000e+03   \n",
       "max       10.00000      8.000000  4.490000e+06     2.245000e+06   \n",
       "\n",
       "       price_bedrooms     room_diff      room_num     Year         Month  \\\n",
       "count    4.935200e+04  49352.000000  49352.000000  49352.0  49352.000000   \n",
       "mean     1.657567e+03     -0.329460      2.753820   2016.0      5.014852   \n",
       "std      7.817996e+03      0.947732      1.446091      0.0      0.824442   \n",
       "min      4.300000e+01     -5.000000      0.000000   2016.0      4.000000   \n",
       "25%      1.066667e+03     -1.000000      2.000000   2016.0      4.000000   \n",
       "50%      1.383417e+03      0.000000      2.000000   2016.0      5.000000   \n",
       "75%      1.962500e+03      0.000000      4.000000   2016.0      6.000000   \n",
       "max      1.496667e+06      8.000000     13.500000   2016.0      6.000000   \n",
       "\n",
       "                Day       ...                walk         walls           war  \\\n",
       "count  49352.000000       ...        49352.000000  49352.000000  49352.000000   \n",
       "mean      15.206881       ...            0.003080      0.000385      0.186477   \n",
       "std        8.280749       ...            0.055412      0.019618      0.389495   \n",
       "min        1.000000       ...            0.000000      0.000000      0.000000   \n",
       "25%        8.000000       ...            0.000000      0.000000      0.000000   \n",
       "50%       15.000000       ...            0.000000      0.000000      0.000000   \n",
       "75%       22.000000       ...            0.000000      0.000000      0.000000   \n",
       "max       31.000000       ...            1.000000      1.000000      1.000000   \n",
       "\n",
       "             washer         water    wheelchair          wifi       windows  \\\n",
       "count  49352.000000  49352.000000  49352.000000  49352.000000  49352.000000   \n",
       "mean       0.009361      0.000446      0.028165      0.002026      0.001013   \n",
       "std        0.101625      0.021109      0.165446      0.044969      0.031814   \n",
       "min        0.000000      0.000000      0.000000      0.000000      0.000000   \n",
       "25%        0.000000      0.000000      0.000000      0.000000      0.000000   \n",
       "50%        0.000000      0.000000      0.000000      0.000000      0.000000   \n",
       "75%        0.000000      0.000000      0.000000      0.000000      0.000000   \n",
       "max        2.000000      1.000000      1.000000      1.000000      1.000000   \n",
       "\n",
       "               work  interest_level  \n",
       "count  49352.000000    49352.000000  \n",
       "mean       0.000952        1.616895  \n",
       "std        0.030846        0.626035  \n",
       "min        0.000000        0.000000  \n",
       "25%        0.000000        1.000000  \n",
       "50%        0.000000        2.000000  \n",
       "75%        0.000000        2.000000  \n",
       "max        1.000000        2.000000  \n",
       "\n",
       "[8 rows x 228 columns]"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#读取数据的基本统计信息\n",
    "train.describe()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "#分离特征列与目标列\n",
    "y_train = train['interest_level']\n",
    "\n",
    "X_train = train.drop(['interest_level'], axis=1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.axes._subplots.AxesSubplot at 0xc1009e8>"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAZUAAAELCAYAAAARNxsIAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4wLCBo\ndHRwOi8vbWF0cGxvdGxpYi5vcmcvpW3flQAAFuZJREFUeJzt3X/wXXWd3/HniwDqVm2CfLWYxIbR\ntBptDfotpNLpuGgh0GkTd2QXpkqWMhN1YNXZnR1xpyMuysw6u8qIq8ywQyTZcQUWtaRO3GyGxVpY\nfiRoBEK0+RapRCgEAwraxYG++8f9fPWa3OR7E87NzTd5PmbO3HPf5/M593P4Tnx5zvncc1NVSJLU\nhWPGPQBJ0pHDUJEkdcZQkSR1xlCRJHXGUJEkdcZQkSR1xlCRJHXGUJEkdcZQkSR15thxD+BQO/HE\nE2vRokXjHoYkzSr33HPPE1U1MVO7oy5UFi1axJYtW8Y9DEmaVZL872HaeflLktSZkYVKkhcnuTvJ\nd5NsS/LHrX5dkh8k2dqWpa2eJFclmUpyb5K39O1rVZIdbVnVV39rkvtan6uSZFTHI0ma2Sgvfz0L\nnFFVzyQ5DrgtyTfatj+sqpv2aH82sLgtpwFXA6clOQG4DJgECrgnyfqqerK1WQ3cCWwAlgPfQJI0\nFiM7U6meZ9rb49qyv+fsrwDWtX53AnOTnAScBWyqqt0tSDYBy9u2l1fVHdV7fv86YOWojkeSNLOR\n3lNJMifJVuBxesFwV9t0RbvEdWWSF7XafODhvu47W21/9Z0D6oPGsTrJliRbdu3a9YKPS5I02EhD\npaqer6qlwALg1CRvAj4KvB74V8AJwEda80H3Q+og6oPGcU1VTVbV5MTEjDPiJEkH6ZDM/qqqp4Bv\nAsur6tF2ietZ4IvAqa3ZTmBhX7cFwCMz1BcMqEuSxmSUs78mksxt6y8B3gl8r90Loc3UWgnc37qs\nBy5os8CWAT+pqkeBjcCZSeYlmQecCWxs255Osqzt6wLg5lEdjyRpZqOc/XUSsDbJHHrhdWNVfT3J\n3yWZoHf5aivw/tZ+A3AOMAX8HLgQoKp2J/kEsLm1u7yqdrf1DwDXAS+hN+vLmV+SNEbpTZw6ekxO\nTpbfqJcOb6d/7vRxD+GId/vv3X5A7ZPcU1WTM7XzG/WSpM4YKpKkzhgqkqTOGCqSpM4YKpKkzhgq\nkqTOGCqSpM4YKpKkzhgqkqTOGCqSpM4YKpKkzhgqkqTOGCqSpM4YKpKkzhgqkqTOGCqSpM4YKpKk\nzhgqkqTOGCqSpM4YKpKkzhgqkqTOjCxUkrw4yd1JvptkW5I/bvWTk9yVZEeSG5Ic3+ovau+n2vZF\nffv6aKt/P8lZffXlrTaV5NJRHYskaTijPFN5Fjijqt4MLAWWJ1kGfAq4sqoWA08CF7X2FwFPVtXr\ngCtbO5IsAc4D3ggsB76QZE6SOcDngbOBJcD5ra0kaUxGFirV80x7e1xbCjgDuKnV1wIr2/qK9p62\n/R1J0urXV9WzVfUDYAo4tS1TVfVgVf0CuL61lSSNyUjvqbQziq3A48Am4H8BT1XVc63JTmB+W58P\nPAzQtv8EeEV/fY8++6pLksZkpKFSVc9X1VJgAb0zizcMatZes49tB1rfS5LVSbYk2bJr166ZBy5J\nOiiHZPZXVT0FfBNYBsxNcmzbtAB4pK3vBBYCtO3/GNjdX9+jz77qgz7/mqqarKrJiYmJLg5JkjTA\nKGd/TSSZ29ZfArwT2A7cCry7NVsF3NzW17f3tO1/V1XV6ue12WEnA4uBu4HNwOI2m+x4ejfz14/q\neCRJMzt25iYH7SRgbZuldQxwY1V9PckDwPVJPgl8B7i2tb8W+MskU/TOUM4DqKptSW4EHgCeAy6u\nqucBklwCbATmAGuqatsIj0eSNIORhUpV3QucMqD+IL37K3vW/wE4dx/7ugK4YkB9A7DhBQ9WktQJ\nv1EvSeqMoSJJ6oyhIknqjKEiSeqMoSJJ6oyhIknqjKEiSeqMoSJJ6oyhIknqjKEiSeqMoSJJ6oyh\nIknqjKEiSeqMoSJJ6oyhIknqjKEiSeqMoSJJ6oyhIknqjKEiSeqMoSJJ6oyhIknqzMhCJcnCJLcm\n2Z5kW5IPtfrHk/woyda2nNPX56NJppJ8P8lZffXlrTaV5NK++slJ7kqyI8kNSY4f1fFIkmY2yjOV\n54A/qKo3AMuAi5MsaduurKqlbdkA0LadB7wRWA58IcmcJHOAzwNnA0uA8/v286m2r8XAk8BFIzwe\nSdIMRhYqVfVoVX27rT8NbAfm76fLCuD6qnq2qn4ATAGntmWqqh6sql8A1wMrkgQ4A7ip9V8LrBzN\n0UiShnFI7qkkWQScAtzVSpckuTfJmiTzWm0+8HBft52ttq/6K4Cnquq5PeqSpDEZeagkeSnwFeDD\n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\n+vP/qqr+Jslm4MYkFwE/BM5t7TcA5wBTwM+BCwGqaneSTwCbW7vLq2r3oTsMSdKeDnmoVNWDwJsH\n1H8MvGNAvYCL97GvNcCarscoSTo4h9OUYknSLGeoSJI6M64pxbPCW/9w3biHcMS7508vGPcQJHXI\nMxVJUmcMFUlSZwwVSVJnDBVJUmcMFUlSZwwVSVJnDBVJUmcMFUlSZwwVSVJnDBVJUmcMFUlSZwwV\nSVJnDBVJUmcMFUlSZwwVSVJnDBVJUmcMFUlSZwwVSVJnZn2oJFme5PtJppJcOu7xSNLRbFaHSpI5\nwOeBs4ElwPlJlox3VJJ09JrVoQKcCkxV1YNV9QvgemDFmMckSUet2R4q84GH+97vbDVJ0hgcO+4B\nvEAZUKu9GiWrgdXt7TNJvj/SUY3XicAT4x7EsPJnq8Y9hMPJrPrbAXDZoH+CR61Z9ffLBw/4b/dP\nh2k020NlJ7Cw7/0C4JE9G1XVNcA1h2pQ45RkS1VNjnscOnD+7WY3/349s/3y12ZgcZKTkxwPnAes\nH/OYJOmoNavPVKrquSSXABuBOcCaqto25mFJ0lFrVocKQFVtADaMexyHkaPiMt8Ryr/d7ObfD0jV\nXve1JUk6KLP9nook6TBiqBwhfFzN7JVkTZLHk9w/7rHowCRZmOTWJNuTbEvyoXGPady8/HUEaI+r\n+Z/Av6M3zXozcH5VPTDWgWkoSf4t8AywrqreNO7xaHhJTgJOqqpvJ3kZcA+w8mj+t+eZypHBx9XM\nYlX1LWD3uMehA1dVj1bVt9v608B2jvKnehgqRwYfVyONWZJFwCnAXeMdyXgZKkeGoR5XI2k0krwU\n+Arw4ar66bjHM06GypFhqMfVSOpekuPoBcqXquqr4x7PuBkqRwYfVyONQZIA1wLbq+oz4x7P4cBQ\nOQJU1XPA9ONqtgM3+ria2SPJl4E7gH+eZGeSi8Y9Jg3tdOC9wBlJtrblnHEPapycUixJ6oxnKpKk\nzhgqkqTOGCqSpM4YKpKkzhgqkqTOGCqSpM4YKhKQ5O+HaPPhJL8x4nEsnel7Dkl+N8mfd/y5ne9T\nRydDRQKq6m1DNPswcECh0n6W4EAsBY7qL89pdjNUJCDJM+317Um+meSmJN9L8qX0fBB4NXBrkltb\n2zOT3JHk20n+uj1UkCQPJflYktuAc5O8NsnfJLknyf9I8vrW7twk9yf5bpJvtUfsXA78Tvtm9u8M\nMe6JJF9Jsrktpyc5po1hbl+7qSSvGtS+8/+YOqodO+4BSIehU4A30nso5+3A6VV1VZLfB36zqp5I\nciLwX4B3VtXPknwE+H16oQDwD1X1bwCS3AK8v6p2JDkN+AJwBvAx4Kyq+lGSuVX1iyQfAyar6pIh\nx/pZ4Mqqui3Ja4CNVfWGJDcD7wK+2D7zoap6LMlf7dkeeMML/O8l/ZKhIu3t7qraCZBkK7AIuG2P\nNsuAJcDtvWcKcjy953dNu6H1fynwNuCvWzuAF7XX24HrktwIHOzTbd8JLOnb98vbLxDeQC+0vkjv\nAaM3zNBe6oShIu3t2b715xn87yTApqo6fx/7+Fl7PQZ4qqqW7tmgqt7fziL+PbA1yV5thnAM8K+r\n6v/+2uCSO4DXJZkAVgKfnKH9QXy0tDfvqUjDexqY/n/1dwKnJ3kdQJLfSPLP9uzQfrDpB0nObe2S\n5M1t/bVVdVdVfQx4gt5v4vR/xjD+lt4Tqmn7XNo+t4CvAZ+h91j2H++vvdQVQ0Ua3jXAN5LcWlW7\ngN8FvpzkXnoh8/p99PtPwEVJvgtsA1a0+p8muS/J/cC3gO8Ct9K7PDXUjXrgg8BkknuTPAC8v2/b\nDcB7+NWlr5naSy+Yj76XJHXGMxVJUme8US8dppJcCHxoj/LtVXXxOMYjDcPLX5Kkznj5S5LUGUNF\nktQZQ0WS1BlDRZLUGUNFktSZ/w9lZsRU/EFK2AAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0xc7517f0>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "sns.countplot(train.interest_level)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "#从上图可知，三类目标的样本数量不均匀，故采用分层采样，考虑时间代价，将划分等级设为3，可能会影响最终的模型参数\n",
    "kfold = StratifiedKFold(n_splits=3, shuffle=True, random_state=3)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "#自定义函数，将数据与XGBClassifier作为输入参数，并利用xgboost.cv交叉求出模型的最佳n_estimators个数并返回\n",
    "def modelfit(alg, X_train, y_train, cv_folds=None, early_stopping_rounds=10):\n",
    "    xgb_param = alg.get_xgb_params()\n",
    "    xgb_param['num_class'] = 3 #三类分类问题\n",
    "    \n",
    "    #直接调用xgboost，而非sklarn的wrapper类\n",
    "    xgtrain = xgb.DMatrix(X_train, label = y_train) #xgboost.cv中传入的是xgboost.DMatrix格式数据\n",
    "        \n",
    "    cvresult = xgb.cv(xgb_param, xgtrain, num_boost_round=alg.get_params()['n_estimators'], folds =cv_folds,\n",
    "             metrics='mlogloss', early_stopping_rounds=early_stopping_rounds) #这里注意xgboost.cv的folds与n_fold的区别\n",
    "  \n",
    "    cvresult.to_csv('1_nestimators.csv', index_label = 'n_estimators') #将迭代得到的n_estimators与对应模型的metrics=mlogloss值保存在csv文件中\n",
    "    \n",
    "    #最佳参数n_estimators\n",
    "    n_estimators = cvresult.shape[0]\n",
    "    \n",
    "    # 采用交叉验证得到的最佳参数n_estimators，训练模型\n",
    "    alg.set_params(n_estimators = n_estimators)\n",
    "    alg.fit(X_train, y_train, eval_metric='mlogloss')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "#实例化第一轮n_estimators调优的XGBClassifier\n",
    "xgb1 = XGBClassifier(\n",
    "        learning_rate =0.1,\n",
    "        n_estimators=1000,  #此处可将n_estimators设定大一些，因为cv过程会自动求出最佳的n_estimators值\n",
    "        max_depth=5,\n",
    "        min_child_weight=1,\n",
    "        gamma=0,\n",
    "        subsample=0.3,\n",
    "        colsample_bytree=0.8,\n",
    "        colsample_bylevel=0.7,\n",
    "        objective= 'multi:softprob',\n",
    "        seed=3)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "modelfit(xgb1, X_train, y_train, cv_folds = kfold) #传入数据，进行训练"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'base_score': 0.5,\n",
       " 'booster': 'gbtree',\n",
       " 'colsample_bylevel': 0.7,\n",
       " 'colsample_bytree': 0.8,\n",
       " 'gamma': 0,\n",
       " 'learning_rate': 0.1,\n",
       " 'max_delta_step': 0,\n",
       " 'max_depth': 5,\n",
       " 'min_child_weight': 1,\n",
       " 'missing': None,\n",
       " 'n_estimators': 220,\n",
       " 'n_jobs': 1,\n",
       " 'nthread': None,\n",
       " 'objective': 'multi:softprob',\n",
       " 'random_state': 0,\n",
       " 'reg_alpha': 0,\n",
       " 'reg_lambda': 1,\n",
       " 'scale_pos_weight': 1,\n",
       " 'seed': 3,\n",
       " 'silent': True,\n",
       " 'subsample': 0.3}"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "params_1=xgb1.get_params()  #得到训练后更新的参数值\n",
    "params_1"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "经过xgboost.cv得到的模型最佳n_estimators为220"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0xc06c908>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "#从保存的csv文件中读取数据\n",
    "cvresult = pd.DataFrame.from_csv('1_nestimators.csv')\n",
    "        \n",
    "# plot\n",
    "test_means = cvresult['test-mlogloss-mean']\n",
    "test_stds = cvresult['test-mlogloss-std'] \n",
    "        \n",
    "train_means = cvresult['train-mlogloss-mean']\n",
    "train_stds = cvresult['train-mlogloss-std'] \n",
    "\n",
    "#将横轴设为n_estimators的数量值（个数）\n",
    "x_axis = range(0, cvresult.shape[0])\n",
    "\n",
    "#将不同n_estimators下模型的mlogloss均值与方差反映在图中\n",
    "pyplot.errorbar(x_axis, test_means, yerr=test_stds ,label='Test')\n",
    "pyplot.errorbar(x_axis, train_means, yerr=train_stds ,label='Train')\n",
    "pyplot.title(\"XGBoost n_estimators vs Log Loss\")\n",
    "pyplot.xlabel( 'n_estimators' )\n",
    "pyplot.ylabel( 'Log Loss' )\n",
    "pyplot.savefig( 'n_estimators4_1.png' )\n",
    "\n",
    "pyplot.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n/vzibrqaGFc3qQr8LpO6TNUn3U7GWiWrjL78pq0KCcqX3/gcPnvqP0bEfvDXWwuvPfOqe1raPzmX\nRu3jd5HUpbpp07hW22Or9QoJym5bPrWwquiwM64rvPZjp1xZiD382JLWdrCPNVtuMpFRI353tNuy\n3rsXiqqjn5OWw/d6LudcN/IX4ouevhaX3PLQiNiFNz9YeG395nUA/7h7fms7qBFMZNSIX/V2WFYz\nZ+D602Gbd3auL+o7/Zy0HPeObQq//Ga/+lkcfvY/G7523x9dWoj9+nI3mG638U4ANqHpHX4V22Fa\nzaf5L9+A0z6cHTthVh1SlrTU64Vl0GXevO2GhQRl7uyXs0P90uiBFZk3f+TS6LLE5v0/Lq4oOuHC\nWwuxf97bGzvsVt14N9NTdfnVabeHeu9+JuoPvbJ3S5nly5ZGH1hcGr3TZmvz17oS0ZV3FFcUHXte\ncUXRO35Q3GH3K2ddX4jd+sBjDfuryWs2kZnKmEnS2PzMSJqwXtm7pVlHvW3rwi+cI968FZ/+9bUj\nYq9//vqcUbeCaO3VVuDBR0dOxq2/nQDAW46/uBA7+BdXTbTLqrCy8pWjPcP674o7beU14fGHO90L\naco1KiP1yujLK7dYl2yz6mGff/2WhQTlDwe9tPCL5wMvfTrf/8vImzAOrLQc8xeN/NxccOMDhfd9\n1TcvKMSOPOfGQuxv/36oEFN36del3b13RVW0wqpwWD4MfMHX4U9fyo4XP+ocFPWtfht9KfPBl21a\nSFD+9ImXFRKZT+2xOf/z+5HJx0OPPVE438/+dkch9uGf/b0Qe/23LyzEypZfP1B3ewJVU69OJK5+\nD3vNtvsOJyjf2Dz718my0gj9MvrSrLe+cKNCgvKT923HO384cqXRrB035sSLRt67aOZaq3D7QwtH\nxO4ZXFR4j7Ll13sc/ddC7AunF/eWWfSE2yd0k7I/AKqYtBRnhmlqLb9Kp3sgdb2hBKb2UbUfrlPt\n2esPFGIf2XWzQuw3B+xQiJ0w64WF2P/b41mF2LQovu8ZVxd3593pa+cXYsf+qXgPpXnzi4mRNBoT\nlCpYWhyqlTQ+Q0nLdV/cvdNdqbznbjijEPuvF25YiM2dvWsh9uGXP6Op9zjhouJdqF/7rWJpab+T\nLi/Efva32wuxJU8uK8TU20xQquDi73S6B1LPqB1dWWe1lUxaJmF6yRDKe16ySSF2/ideVoi9tSTh\n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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0xbf9ccf8>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "#局部细节图\n",
    "cvresult = pd.DataFrame.from_csv('1_nestimators.csv')\n",
    "\n",
    "cvresult = cvresult.iloc[50:]\n",
    "# plot\n",
    "test_means = cvresult['test-mlogloss-mean']\n",
    "test_stds = cvresult['test-mlogloss-std'] \n",
    "        \n",
    "train_means = cvresult['train-mlogloss-mean']\n",
    "train_stds = cvresult['train-mlogloss-std'] \n",
    "\n",
    "x_axis = range(50,cvresult.shape[0]+50)\n",
    "        \n",
    "fig = pyplot.figure(figsize=(6, 6), dpi=100)\n",
    "pyplot.errorbar(x_axis, test_means, yerr=test_stds ,label='Test')\n",
    "pyplot.errorbar(x_axis, train_means, yerr=train_stds ,label='Train')\n",
    "pyplot.title(\"XGBoost n_estimators vs Log Loss\")\n",
    "pyplot.xlabel( 'n_estimators' )\n",
    "pyplot.ylabel( 'Log Loss' )\n",
    "pyplot.savefig( 'n_estimators_detail.png' )\n",
    "\n",
    "pyplot.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "从图可知，随n_estimators增大到200以上时，以mlogloss为评价指标时，train数据集的性能仍在提高，而test数据集的性能已逐步趋稳。"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
